// Copyright 2011 The Walk Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"log"
	"net/url"
	"strings"
)

import (
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
)

const MYDDC_URL = "http://myddc.ccnu.300y.com.cn/myddc"
const SHUTDOWN_TIME = 40 //关机等待时间为40秒
const APP_TITLE = "华中师范大学多媒体教学使用满意度调查"

var (
	ch_exit                chan int = make(chan int) //串口处理器收到退出时通知
	chan_timer_handle_exit chan int = make(chan int) //定时器收到退出时通知
	ch_serial_rx_shutdown  chan int = make(chan int) //串口收到关机指令后，写入通道传递给主程序，开始关机倒计时并显示出 满意度调查表窗体
)
var (
	mw      *walk.MainWindow
	webview *walk.WebView //定义webview窗体
)

func checkError(err error) {
	if err != nil {
		log.Fatal(err)
	}
}

func t1() {
	//响应webview的URL改变事件
	//mw.FormBase.SetTitle("hehehehe") //更改窗口标题
	var (
		change_url string
		err        error
	)
	change_url, err = webview.URL()        //取得webview的URL
	url_path, err := url.Parse(change_url) //分析URL，取出Path
	log.Println("刷新了网页事件，URL：", change_url, "\n URL path:", url_path.Path)
	if url_path.Path == "/myddcok" { //如果URL的Path是/myddcok则关机
		log.Println("服务器提交成功!关机！")
		shutdown()
	}
	if err != nil {
		log.Println("取URL错误：", change_url)
	}
}

func main() {
	// We need either a walk.MainWindow or a walk.Dialog for their message loop.
	// We will not make it visible in this example, though.
	var (
		i   bool //是否使用通道标志
		err error
	)
	//
	s, err := serial_open() //打开串口
	if err != nil {
		log.Println("不进行串口通讯处理！")
		i = false //置通道标志为假，串口打开报错则不使用通道，以免造成死锁
	} else {
		i = true
		go serial_loop(s) //串口通讯处理器，接收到串口关机指令后，写入通道
	}
	mw, err = walk.NewMainWindow()
	if err != nil {
		log.Fatal(err)
	}
	//定义窗体内容
	if err := (MainWindow{
		AssignTo: &mw,
		Icon:     Bind("'../img/' + icon(wv.URL) + '.ico'"),
		Title:    "华中师范大学多媒体教学使用满意度调查",
		MinSize:  Size{800, 600},
		Layout:   VBox{MarginsZero: true},
		Children: []Widget{
			/*LineEdit{
				AssignTo: &le,
				Text:     Bind("wv.URL"),
				OnKeyDown: func(key walk.Key) {
					if key == walk.KeyReturn {
						wv.SetURL(le.Text())
					}
				},
			},*/ //不要显示URL框
			WebView{
				AssignTo:     &webview,
				Name:         "webview",
				URL:          MYDDC_URL,
				OnURLChanged: t1, //响应webview的URL改变事件
			},
		},
		Functions: map[string]func(args ...interface{}) (interface{}, error){
			"icon": func(args ...interface{}) (interface{}, error) {
				if strings.HasPrefix(args[0].(string), "https") {
					return "check", nil
				}

				return "stop", nil
			},
		},
	}.Create()); err != nil {
		log.Fatal(err)
	}
	// We load our icon from a file.
	icon, err := walk.NewIconFromFile("x.ico")
	if err != nil {
		log.Fatal(err)
	}

	// Create the notify icon and make sure we clean it up on exit.
	ni, err := walk.NewNotifyIcon()
	if err != nil {
		log.Fatal(err)
	}
	defer ni.Dispose()

	// Set the icon and a tool tip text.
	if err := ni.SetIcon(icon); err != nil {
		log.Fatal(err)
	}
	if err := ni.SetToolTip(
		"华中师范大学多媒体教室管理客户端\n请不要关闭我."); err != nil {
		log.Fatal(err)
	}

	// When the left mouse button is pressed, bring up our balloon.
	ni.MouseDown().Attach(func(x, y int, button walk.MouseButton) {
		if button != walk.LeftButton {
			return
		}
		if err := ni.ShowMessage(
			"华中师范大学多媒体教室管理客户端",
			"请不要关闭我."); err != nil {
			log.Fatal(err)
		}
	})
	// We put an exit action into the context menu.
	openAction := walk.NewAction()
	if err := openAction.SetText("O&pen"); err != nil {
		log.Fatal(err)
	}
	openAction.Triggered().Attach(func() {
		//log.Println("点击了打开主窗口钮！")
		//mw.Show()	//点打开后不显示主窗体了，改成由串口指令激发显示窗体
		ni.ShowMessage("Tip", "多媒体教室管理系统客户端！")
	})
	if err := ni.ContextMenu().Actions().Add(openAction); err != nil {
		log.Fatal(err)
	}

	// We put an exit action into the context menu.
	exitAction := walk.NewAction()
	if err := exitAction.SetText("E&xit"); err != nil {
		log.Fatal(err)
	}
	exitAction.Triggered().Attach(func() {
		//walk.App().Exit(0)
		ni.ShowWarning("华中师范大学信息办 提示：", "请不要退出本程序！退出后不能管理了！")
	})
	if err := ni.ContextMenu().Actions().Add(exitAction); err != nil {
		log.Fatal(err)
	}

	// The notify icon is hidden initially, so we have to make it visible.
	if err := ni.SetVisible(true); err != nil {
		log.Fatal(err)
	}

	// Now that the icon is visible, we can bring up an info balloon.
	if err := ni.ShowInfo(
		"华中师范大学信息办 提示：",
		"请不要关闭我."); err != nil {
		log.Fatal(err)
	}
	//主窗体关闭事件
	mw.Closing().Attach(func(canceled *bool, reason walk.CloseReason) { //主窗体关闭事件，不让关闭
		log.Println("主窗体关闭事件，但不允许关闭，只是隐藏窗体！")
		*canceled = true            //取消关闭窗体
		mw.Hide()                   //改居隐藏窗体
		webview.SetURL(MYDDC_URL)   //刷新webview的网址，以免提交后网址不正确，顺便提前载入页面
		chan_timer_handle_exit <- 1 //写入通道，通知关机定时器退出线程
		/*if reason == walk.CloseReasonUser {
			*canceled = true
			mw.Hide()
		}else{
			*canceled = true
			mw.Hide()
		}*/
	})
	//主窗体开始事件
	mw.Starting().Attach(func() {
		log.Println("主窗体开始事件！")
		mw.Hide()
	})

	// Run the message loop.
	mw.Run()
	if i == true {
		ch_exit <- 1 //串口没有打开，串口处理器没运行，所以退出
	}
	log.Println("主窗体退出，即整个程序退出执行！")
}
